﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Aquasoft.Iszr.Proxy.WebServices.Interfaces;

namespace Aquasoft.Iszr.Proxy.WebServices
{
    public static class StavTypeExtensions
    {
        //pomaha pouziti explicitnich interfaces
        public static StavType GetStav<T>(this T value) where T:IStavType
        {
            return value.Stav.GetValueOrDefault(StavType.spravny);
        }

        public static TO GetStavValue<T,TO>(this T value, Func<T,TO> valueExtractor) where T:IStavType
        {
            var stav = value.Stav.GetValueOrDefault(StavType.spravny);
            if (stav != StavType.spravny)
                throw new InvalidOperationException("Nelze číst hodnotu, protože její stav je " + stav);
            return valueExtractor(value);
        }

        public static TO GetStavValueOrDefault<T, TO>(this T value, Func<T, TO> valueExtractor, TO defaultValue = default(TO)) where T : IStavType
        {
            var stav = value.Stav.GetValueOrDefault(StavType.spravny);
            if (stav != StavType.spravny)
                return defaultValue;
            return valueExtractor(value);
        }

        public static TV GetStavValue<TV>(this IStavTypeValue<TV> value)
        {
            return GetStavValue(value, v => v.Value);
        }

        public static TV GetFirstSpravnyStavOrDefault<TV>(this IEnumerable<IStavTypeValue<TV>> values)
        {
            if (values == null)
                return default(TV);
            return values.Where(v => v.Stav.GetValueOrDefault(StavType.spravny) == StavType.spravny).Select(v => v.Value).FirstOrDefault();
        }
    }
}
